package com.wyz.jdk5;

import java.util.concurrent.Exchanger;

/**
 * @author wyz
 * @version 1.0
 * @description: 演示交换者示例
 *
 * @date 2023/4/23 22:15
 */
public class ExchangerDemo {
    /**
     *  通过执行代码 可以发现，Exchanger 是作于与两个线程之间的数据交换的
     *  当第一个线程执行exchange方法是，会被阻塞在此，一致等待另一个线程执行exchange的方法来唤醒。
     *  所以使用Exchanger 一定要注意两个线程要确保两个线程一定都会执行exchange方法，否则会出现一致阻塞死锁情况。
     *  为了防止一直等待的情况 ，我们可以使用public V exchange(V x, long timeout, TimeUnit unit) 这个方法来打破一致阻塞问题。
     *
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        //定义一个交换者
        Exchanger<String> exchanger = new Exchanger<>();

        new Thread(()->{
            String name = "A";
            try {
                System.out.println("我是A ");
                String exchange = exchanger.exchange(name);
                System.out.println("A 获取到交换值 " + exchange);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

        }).start();

        new Thread(()->{
            String name = "B";
            try {
                Thread.sleep(10000);
                System.out.println("我是B");
                String exchange = exchanger.exchange(name);
                System.out.println("B 获取到交换值 " + exchange);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

        }).start();

        Thread.sleep(20000);
    }
}
